<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>
</head>

<body>
    <div id="app">
        <input type="button" value="start" @click="start">
        <input type="button" value="stop" @click="stop">
        <h4>{{msg}}</h4>
    </div>


    <script>
        // 注意：在vm实例中，如果想要获取data上的数据，或者调用methods中的方法，必须通过this.数据属性名或者this.方法名
        // 来进行访问，this就表示我们new出来的vm实例对象

        var vm = new Vue({
            el: '#app',
            data: {
                msg: '稳住，我们能赢！！！',
                intervalId: null
            },
            methods: {
                // start: function(){
                //     console.log(this.msg)
                // }
                // 采用es6写法
                start() {
                    //使用定时器 每隔400毫秒执行一次，因为this只能指向当前对象，所以先接收一下

                    // var _this = this
                    // setInterval(function (){
                    //     console.log(_this.msg)
                    //     var str1 = _this.msg.substring(0,1)
                    //     var str2 = _this.msg.substring(1)
                    //     _this.msg = str2 + str1
                    // },400)

                    // 使用箭头函数改写,可以解决this指向问题
                    // 箭头函数内部的this 和 外部保持一致
                    if (this.intervalId != null) return;
                    //接收定时器的id 作为停止时调用的参数
                    this.intervalId = setInterval(() => {
                            console.log(this.msg)
                            var str1 = this.msg.substring(0, 1)
                            var str2 = this.msg.substring(1)
                            this.msg = str2 + str1
                        }, 400)
                        // 注意：vm实例中，会监听自己身上data数据中所有数据的改变，只要数据一发生改变，就会自动把最新的数据，从data
                        // 同步到页面上去；这样我们就只关心数据 不用考虑如何重新渲染DOM页面
                },
                stop() {
                    //停止定时器
                    clearInterval(this.intervalId)
                        //停止后 重置intervalId为null 不然会影响开启时的判断
                    this.intervalId = null
                }
            }
        })
    </script>
</body>

</html>